Skip to content
标签
spring
数据库
字数
791 字
阅读时间
4 分钟

一、概述

MongoDB是一个跨平台的,面向文档的数据库,是非关系数据库当中功能最丰富,最像关系数据库的产品。它支持的数据结构非常松散,是类似 JSON 的一种格式,因此可以存储比较复杂的数据类型。

MongoDB主要由文档(document)、集合(collection)、数据库(database)三部分组成

  • 文档(document)就相当于关系数据库中的一行记录
  • 多个文档组成一个集合(collection),相当于关系数据库的表
  • 多个集合组织在一起,就是数据库(database),一个 MongoDB 实例支持多个数据库

SpringData MongoDB是SpringData技术封装了mongodb-driver技术之后的产物,它可以用更加简单的方式操作MongoDB。

二、使用示例

2.1 入门demo

依赖

xml
<dependency> 
    <groupId>org.springframework.data</groupId> 
    <artifactId>spring-data-mongodb</artifactId>
    <version>2.1.8.RELEASE</version> 
</dependency>

配置

xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:mongo="http://www.springframework.org/schema/data/mongo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/data/mongo
        http://www.springframework.org/schema/data/mongo/spring-mongo.xsd">

    <!--包扫描-->
    <mongo:repositories base-package="com.itheima"/>


    <!-- spring连接mongodb数据库的配置 -->
    <!--
        host="192.168.106.128" 指定mongodb服务所在主机地址
        port="27017"  指定mongodb服务所在主机端口号
        dbname="heima"  数据名称
    -->
    <mongo:mongo-client host="192.168.106.128" port="27017" id="mongo">
        <mongo:client-options write-concern="SAFE"/>
    </mongo:mongo-client>
    <mongo:db-factory id="mongoDbFactory" dbname="heima" mongo-ref="mongo"/>


    <!--mongoTemplate-->
    <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
        <constructor-arg name="mongoDbFactory" ref="mongoDbFactory"/>
    </bean>
</beans>

实体类

java
package com.itheima.domain;

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

//使用@Document建立的是实体类和collection的关系
@Document("article")
public class Article {

    @Id//用来标识主键
    private Integer id;

    //使用@Field建立实体类中属性跟collection中字段的映射关系,如果省略,代表两个名称一致
    //@Field
    private String name;
    private String content;
    private Integer hits;

    // 省略get/set toString 方法
}

dao层接口

java
package com.itheima.dao;

import com.itheima.domain.Article;
import org.springframework.data.mongodb.repository.MongoRepository;

import java.util.List;

public interface ArticleDao extends MongoRepository<Article, Integer> {

    //根据标题查询
    List<Article> findByNameLike(String name);

    //根据点击量查询
    List<Article> findByHitsGreaterThan(Integer hits);

}

使用方式

java
package com.itheima.test;

import com.itheima.dao.ArticleDao;
import com.itheima.domain.Article;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import java.util.List;
import java.util.Optional;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class ArticleDaoTest {

    @Autowired
    private ArticleDao articleDao;


    //保存
    @Test
    public void testSave() {
        Article article = new Article();
        article.setId(1);
        article.setName("黑马程序员");
        article.setContent("黑马程序员很低调");
        article.setHits(100);

        articleDao.save(article);
    }


    //修改
    @Test
    public void testUpdate() {
        Article article = new Article();
        article.setId(1);
        article.setName("黑马程序员2");
        article.setContent("黑马程序员很低调2");
        article.setHits(200);

        articleDao.save(article);
    }

    //修改
    @Test
    public void testDelete() {
        articleDao.deleteById(1);
    }


    //做数据
    @Test
    public void makeData() {
        for (int i = 1; i <= 10; i++) {
            Article article = new Article();
            article.setId(i);
            article.setName("黑马程序员" + i);
            article.setContent("黑马程序员很低调" + i);
            article.setHits(100 + i);

            articleDao.save(article);
        }
    }


    //查询所有
    @Test
    public void testFindAll() {
        List<Article> articles = articleDao.findAll();
        for (Article article : articles) {
            System.out.println(article);
        }
    }

    //主键查询
    @Test
    public void testFindById() {
        Optional<Article> opt = articleDao.findById(1);
        System.out.println(opt.get());
    }

    //分页和排序
    @Test
    public void testFindAllWithPageAndSort() {

        //设置排序条件
        Sort sort = Sort.by(Sort.Order.desc("hits"));

        //设置分页条件
        Pageable pageable = PageRequest.of(1, 3, sort);

        Page<Article> page = articleDao.findAll(pageable);
        for (Article article : page.getContent()) {
            System.out.println(article);
        }
    }


    //根据标题查询
    @Test
    public void testFindByName() {
        List<Article> articles = articleDao.findByNameLike("黑马程序员1");
        for (Article article : articles) {
            System.out.println(article);
        }
    }

    //根据标题查询
    @Test
    public void testFindByHitsGreaterThan() {
        List<Article> articles = articleDao.findByHitsGreaterThan(105);
        for (Article article : articles) {
            System.out.println(article);
        }
    }


}